package cqu.edu.cn.interceptor;

import cqu.edu.cn.utils.CookieUtil;

import org.springframework.web.servlet.HandlerInterceptor;

import cn.hutool.http.HttpUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 自定义的拦截器，主要看访问的URL是否已经登录了
 * @author 杨鑫隆and高鸿成
 */

public class WebInterceptor implements HandlerInterceptor {
	
	//定义两个uri常量
	private static String SSO_SERVER_URL = "http://localhost:8080";
	private static String APP1_URL = "http://localhost:8081";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        // 判断是否有局部会话，也就是之前app1是否已经登录过了，如果登录过了就放行
        HttpSession session = request.getSession();
        String isLogin = (String) session.getAttribute("isLogin");
        if (isLogin != null && isLogin.equals("true")) {
            return true;
        }
        
        // 获取令牌Token，先从Request请求参数中获取
        String token = request.getParameter("Token");
        // 若请求参数未携带Token，再去cookie中获取
        if (token == null) {
            token = CookieUtil.getCookie(request, "Token");
        }

        // 无令牌，直接去登录中心登录
        if (token == null) {
        	String url = "";
            // 获取当前客户端在访问的地址
            String redirectUrl = APP1_URL + request.getServletPath();
            url += SSO_SERVER_URL + "/sso/checkLogin?redirectUrl=" + redirectUrl;
            response.sendRedirect(url.toString());
            return true;
        }

        // 有令牌，请求认证中心校验令牌是否有效，如果有效在认证中心记录app1注册信息
        Map<String, Object> params = new HashMap<>(3);
        params.put("Token", token);
        params.put("LogoutUri", APP1_URL+"/logOut");
        params.put("SessionId", params);
        String checkres = HttpUtil.get(SSO_SERVER_URL + "/sso/checkToken", params);
        Boolean checkToken = checkres.equals("true");
        

        // 令牌无效，直接登录就去登录中心登录
        if (!checkToken) {
        	String url = "";
            //获取当前客户端在访问的地址
            String redirectUrl = APP1_URL + request.getServletPath();
            url += SSO_SERVER_URL + "/sso/checkLogin?redirectUrl=" + redirectUrl;
            response.sendRedirect(url.toString());
            return true;
        }

        // Token有效，创建局部会话设置登录状态，并放行
        session.setAttribute("isLogin", "true");
        // 设置本域cookie
        CookieUtil.setCookie(response, "Token", token, 1800);
        return true;
    }

}